package com.ll.spring5.testdemo;

import com.ll.spring5.Book;
import com.ll.spring5.Orders;
import com.ll.spring5.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.TreeSet;

/**
 * 2020/9/7 - 14:25
 */
public class TestSpring5 {

    @Test
    public void tsetAdd() {
        //1,加载Spring配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

//        ApplicationContext 在启动的时候会自动创建所有bean
//        BeanFactory 只有在用的时候(getBean才创建)

        //2.获取配置创建的对象
        User user = context.getBean("user", User.class);
        user.add();

        //Bean管理
        /**
         * Bean管理指的是两个操作
         * Spring创建对象
         * Spring注入属性
         */

        /**
         * Bean管理操作有两种方式
         * 基于xml配置文件实现
         * 基于注解方式实现
         */

        /**
         * 基于xml方式创建对象
         * 在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
         * 在bean标签有很多属性,介绍常用的属性
         * id属性:唯一标识
         * class属性:类全路径,包类路径
         * spring创建创建的时候,会默认执行无参的构造方法
         */

        /**
         * 基于xml方式注入属性
         * 1.DI:依赖注入,就是注入属性(在创建对象的基础之上)
         * 第一种注入方式: 使用set方法进行注入
         *  创建类,定义属性和对应法的set方法
         *
         *
         * 第二种注入方式: 使用有参构造进行注入
         */


        System.out.println(user);

        //iOC控制反转,把对象创建和对象之间的调用过程,交给SPring进行管理
        //使用IOC目的: 为了耦合度降低


        //IOC底层原理
        //1.xml解析,工厂模式,反射

    }

    //Book类,演示使用set方法注入属性(DI)
    @Test
    public void testBook1() {
        //1.加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

        //获取对象
        Book book = context.getBean("book", Book.class);

        System.out.println(book);
        book.testDemo();
    }

    //Orders类,演示使用有参构造注入属性
    @Test
    public void testOrder() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Orders order = context.getBean("orders", Orders.class);
        order.orderTest();

    }

    //Book类,使用p名称空间注入属性
    @Test
    public void testBook02() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Book book = context.getBean("book", Book.class);
        book.testDemo();

    }

}
